#  Copyright (c) 1997-2011
#  Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Darmstadt, Germany)
#  http://www.polymake.de
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the
#  Free Software Foundation; either version 2, or (at your option) any
#  later version: http://www.gnu.org/licenses/gpl.txt.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#-----------------------------------------------------------------------------
#  $Project: polymake $$Id: generate_docs 10028 2011-01-28 23:11:25Z gawrilow $
#
#  Complete production cycle for automatic part of documentation
#

unless (@ARGV) {
   die "usage: polymake --script generate_docs OutDir AppName ... \n",
       "from the polymake shell: script(\"generate_docs\", \"OutDir\");\n";
}

my $Wiki="http://polymake.org/";

my $docdir="$InstallTop/xml/documentation";

my $outdir=shift @ARGV;

my @Apps=@ARGV;
if ($Shell->interactive) {
   unless (@Apps) { @ARGV=known Core::Application; }
} else {
   # running in batch mode
   unless (@Apps) { @Apps=@start_applications or die "no applications specified\n"; }
   # pretend everything is configured
   *Polymake::Core::Application::configure=sub { 1 };
   # ignore the contents of per-application %configured hash tables
   $Polymake::Core::Application::reconfigure=1;
   # and don't touch them
   *Polymake::Core::Application::close_preamble=sub { 1 };
}

File::Path::mkpath($outdir);

my $tmpdir=Tempfile->new_dir;

script("extract_docs", '--wiki' => $Wiki, '--outsuffix' => '.html', '--outdir' => $tmpdir, @Apps);

my $pmdocns=doc_namespace();

my $writer=open_doc_file("version.xml");
$writer->startTag([ $pmdocns, "version" ]);
if ($DeveloperMode) {
   my ($rev)= `svnversion -n $InstallTop` =~ /(\d+)[A-Z]{0,2}$/;
   $writer->dataElement("revision", $rev);
} else {
   $writer->dataElement("release", $Version);
}
if (my @extensions=keys %Core::Extension::by_URI) {
   $writer->startTag("extensions");
   $writer->dataElement("extension", $_) for @extensions;
   $writer->endTag;
}
$writer->endTag;
close_doc_file($writer);

sub run_xsltproc {
   my ($out, $stylesheet, $in)=@_;
   if (system("xsltproc", "--path", $tmpdir, "--stringparam", "Wiki", $Wiki, "-o", $out, "$docdir/$stylesheet.xsl", "$in")) {
      die "Command 'xsltproc @_' returned with error code $?\n",
          "Temporary files preserved in $tmpdir\n";
   }
}

system("cp -p $docdir/entities/* $tmpdir/");

push(@Apps, "core") if -f "$tmpdir/core.xml";
foreach (@Apps) {
   run_xsltproc("$outdir/inc/$_.inc", "doc", "$_.xml");
}

$writer=open_doc_file("applications.xml");
$writer->startTag([ $pmdocns, "applications" ]);
$writer->emptyTag("file", name => "$_.xml") for @Apps;
$writer->endTag;
close_doc_file($writer);

run_xsltproc("$outdir/inc/index.inc",     "index",     "applications.xml");
run_xsltproc("$tmpdir/all.xml",           "all",       "applications.xml");
run_xsltproc("$outdir/inc/doc_index.inc", "doc_index", "all.xml");

foreach (@Apps) {
   run_xsltproc("$outdir/$_.html", "export", "$outdir/inc/$_.inc");
}
run_xsltproc("$outdir/index.html", "export", "$outdir/inc/index.inc");
run_xsltproc("$outdir/doc_index.html", "export", "$outdir/inc/doc_index.inc");

File::Path::mkpath("$outdir/images");
system("cp -p $docdir/images/*.png $outdir/images");
system("cp -p $docdir/*.js $docdir/*.css $outdir/");


# Local Variables:
# mode: perl
# cperl-indent-level: 3
# indent-tabs-mode:nil
# End:
